package com.ideal.manage.esms.service.monitor;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ideal.manage.esms.bean.DTO.PageDto;
import org.springframework.stereotype.Service;

import java.time.Clock;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 监控Service
 * Created By Dai On 2018-03-26
 */
@Service
public class MonitorService {

    /**
     * 系统监控
     *
     * @return 返回 ztree节点
     */
    public List<JSONObject> getMonitorList() {
        List<JSONObject> list = new ArrayList<>();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("id", 1L);
        jsonObject.put("pId", 0L);
        jsonObject.put("name", "大拇指大厦");
        jsonObject.put("type", 1);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 2L);
        jsonObject.put("pId", 1L);
        jsonObject.put("name", "1#变流器(PCS)");
        jsonObject.put("type", 2);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 3L);
        jsonObject.put("pId", 1L);
        jsonObject.put("name", "1#电池包(BMS)");
        jsonObject.put("type", 3);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 4L);
        jsonObject.put("pId", 3L);
        jsonObject.put("name", "1#电池模组");
        jsonObject.put("type", 4);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 5L);
        jsonObject.put("pId", 4L);
        jsonObject.put("name", "1#电池单体");
        jsonObject.put("type", 5);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 6L);
        jsonObject.put("pId", 4L);
        jsonObject.put("name", "2#电池单体");
        jsonObject.put("type", 5);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 7L);
        jsonObject.put("pId", 3L);
        jsonObject.put("name", "2#电池模组");
        jsonObject.put("type", 4);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 8L);
        jsonObject.put("pId", 7L);
        jsonObject.put("name", "1#电池单体");
        jsonObject.put("type", 5);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 9L);
        jsonObject.put("pId", 7L);
        jsonObject.put("name", "2#电池单体");
        jsonObject.put("type", 5);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 10L);
        jsonObject.put("pId", 1L);
        jsonObject.put("name", "2#变流器(PCS)");
        jsonObject.put("type", 2);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 11L);
        jsonObject.put("pId", 1L);
        jsonObject.put("name", "2#电池包(BMS)");
        jsonObject.put("type", 3);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 12L);
        jsonObject.put("pId", 11L);
        jsonObject.put("name", "1#电池模组");
        jsonObject.put("type", 4);
        list.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("id", 13L);
        jsonObject.put("pId", 11L);
        jsonObject.put("name", "1#电池模组");
        jsonObject.put("type", 4);
        list.add(jsonObject);

        return list;
    }
//    ----------------------------------------- 通 用 -----------------------------------------
    /**
     * 根据id获取type
     *
     * @param id
     * @return
     */
    public int getType(Long id) {
        List<JSONObject> list = getMonitorList();
        int type = 0;
        for (JSONObject jsonObject : list) {
            if (Long.parseLong(jsonObject.get("id").toString()) == id) {
                type = Integer.parseInt(jsonObject.get("type").toString());
            }
        }
        return type;
    }
    /**
     * 获取父类级别id
     * @param id
     * @return
     */
    public Long getParentId(Long id){
        List<JSONObject> list = getMonitorList();
        Long parent = 0L;
        for (JSONObject jsonObject : list) {
            if (Long.parseLong(jsonObject.get("id").toString()) == id) {
                parent = Long.parseLong(jsonObject.get("pId").toString());
            }
        }
        return parent;
    }
    /**
     * 根据id 获取名称
     * @param id
     * @return
     */
    public String getName(Long id) {
        List<JSONObject> list = getMonitorList();
        String name = "";
        for (JSONObject jsonObject : list) {
            if (Long.parseLong(jsonObject.get("id").toString()) == id) {
                name = jsonObject.get("name").toString();
            }
        }
        return name;
    }
    /**
     * 根据id 获取父菜单名称
     * 适用于 PCS级 和 电池包级
     * @param id
     * @return
     */
    public String getParentName(Long id) {
        List<JSONObject> list = getMonitorList();
        Long parent = getParentId(id);
        return getName(parent);
    }
    /**
     * 根据id 获取祖父菜单名称
     * 适用于 模组级别
     * @param id
     * @return
     */
    public String getGrandparentName(Long id) {
        List<JSONObject> list = getMonitorList();
        Long parent = getParentId(id);
        Long grandparent = getParentId(parent);
        return getName(grandparent);
    }
    /**
     * 根据id 获取祖父的父亲菜单名称
     * 适用于 电池级别
     * @param id
     * @return
     */
    public String getGrandparentParentName(Long id){
        List<JSONObject> list = getMonitorList();
        Long parent = getParentId(id);
        Long grandparent = getParentId(parent);
        Long grandparentParent = getParentId(grandparent);
        return getName(grandparentParent);
    }
//    ----------------------------------------- 楼 宇 级 -----------------------------------------

    /**
     * 实时监控 - 实时概况
     * 根据id获取实时概况的实例
     * @param id
     * @return
     */
    public JSONObject getMonitorDataForBlock(Long id) {
        Random random = new Random();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("could_saving_electricity", String.format("%.2f", random.nextDouble()*100000));    // 可储蓄电量
        jsonObject.put("total_electricity", String.format("%.2f", random.nextDouble()*100000));   // 总容量
        jsonObject.put("grand_total_input_capacity", String.format("%.2f", random.nextDouble()*100000));   // 累计充电量
        jsonObject.put("today_input_capacity", String.format("%.2f", random.nextDouble()*100000));   // 今日充电量
        jsonObject.put("safe_operation_days", String.format("%.2f", random.nextDouble()*100000));   // 安全运行天数
        jsonObject.put("grand_total_output_capacity", String.format("%.2f", random.nextDouble()*100000));   // 累计放电量
        jsonObject.put("today_output_capacity", String.format("%.2f", random.nextDouble()*100000));   // 今日放电量
        jsonObject.put("system_efficiency", String.format("%.2f", random.nextDouble()*100000));   // 系统效率
        jsonObject.put("grand_total_save_electricity_cost", String.format("%.2f", random.nextDouble()*100000));   // 累计节省电费
        jsonObject.put("today_save_electricity_cost", String.format("%.2f", random.nextDouble()*100000));   // 今日节省电费
        return jsonObject;
    }

    /**
     * 实时监控 - 故障信息
     * @param id
     * @return
     */
    public JSONArray errorData(Long id) {
        JSONArray list = new JSONArray();
        JSONObject jsonObject ;
        for (int i = 1; i < 10; i++){
            jsonObject= new JSONObject();
            jsonObject.put("name", i + "#电池包");
            jsonObject.put("error_name","故障" + i);
            jsonObject.put("error_type","类型" + i);
            jsonObject.put("time",new Date());
            list.add(jsonObject);
        }
        return list;
    }

    /**
     * 实时监控 - 今日充放电量、电费曲线
     * @param id
     * @return
     */
    public Map todayElectricity(Long id) {
        //TODO 生成随机数 这里记得删掉啊 O(∩_∩)O哈哈~
        Random random = new Random();
        // 最终返回的结果 result
        Map result = new HashMap();
        // 结果result中 应该包含 names-图例、times-x轴显示的时间、lines-series中的内容
        List<String> names = new ArrayList<String>();
        List<String> times = new ArrayList<>();
        List<JSONObject> lines = new ArrayList<>();
        result.put("names", names);
        result.put("times", times);
        result.put("lines", lines);
        // times
        for (int i = 0; i < 24; i ++){
            String time = i+":00:00";
            if (time.length() < 8){
                time = "0" + time;
            }
            times.add(time);
        }
        // lines
        names.add("充电");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "充电");
        jsonObject.put("type", "line");
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 24; i ++){
            list.add(String.format("%.2f", random.nextDouble()*100000));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        names.add("放电");
        jsonObject = new JSONObject();
        jsonObject.put("name", "放电");
        jsonObject.put("type", "line");
        list = new ArrayList<>();
        for (int i = 0; i < 24; i ++){
            list.add(String.format("%.2f", random.nextDouble()*100000));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        names.add("省电费");
        jsonObject = new JSONObject();
        jsonObject.put("name", "省电费");
        jsonObject.put("type", "bar");
        jsonObject.put("yAxisIndex", 1);
        list = new ArrayList<>();
        for (int i = 0; i < 24; i ++){
            list.add(String.format("%.2f", random.nextDouble()*100000));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        names.add("耗电费");
        jsonObject = new JSONObject();
        jsonObject.put("name", "耗电费");
        jsonObject.put("type", "bar");
        jsonObject.put("yAxisIndex", 1);
        list = new ArrayList<>();
        for (int i = 0; i < 24; i ++){
            list.add("-" + String.format("%.2f", random.nextDouble()*100000));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        return result;
    }

    /**
     * 实时监控 - 电池包总览
     * @param id
     * @return
     */
    public List packageInfoData(Long id) {
        Random random = new Random();
        List list = new ArrayList();
        JSONObject jsonObject;
        for (int i = 0; i < 5; i ++){
            jsonObject = new JSONObject();
            jsonObject.put("name", i + "#模组");
            jsonObject.put("voltage",Double.parseDouble(String.format("%.2f", random.nextDouble()*100000)));    //电压
            jsonObject.put("electric_current",Double.parseDouble(String.format("%.2f", random.nextDouble()*100000)));   //电流
            jsonObject.put("soc",Double.parseDouble(String.format("%.2f", random.nextDouble()*100)));    //SOC
            list.add(jsonObject);
        }
        return list;
    }

    /**
     * 实时监控 电池包总览 柱状图
     * @param id
     * @return
     */
    public Map packageInfo(Long id) {
        //TODO 生成随机数 这里记得删掉啊 O(∩_∩)O哈哈~
        Random random = new Random();
        // 最终返回的结果 result
        Map result = new HashMap();
        // 结果result中 这边没有图例，所以只包含 times-x轴显示的时间、lines-series中的内容
        List<String> times = new ArrayList<>();
        List<JSONObject> lines = new ArrayList<>();
        result.put("times", times);
        result.put("lines", lines);
        // times
        for (int i = 0; i < 5; i ++){
            String time = i+"#模组";
            times.add(time);
        }
        // lines
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "单体电压最低(V)");
        jsonObject.put("type", "bar");
        jsonObject.put("stack", "电压");
        jsonObject.put("color", "#FFFFFF");
        jsonObject.put("barMaxWidth", 30);
        List<Double> list = new ArrayList<>();
        for (int i = 0; i < 5; i ++){
            list.add(Double.parseDouble(String.format("%.2f", random.nextDouble()*100000)));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("name", "单体电压极差(V)");
        jsonObject.put("type", "bar");
        jsonObject.put("stack", "电压");
        jsonObject.put("barMaxWidth", 30);
        list = new ArrayList<>();
        for (int i = 0; i < 5; i ++){
            list.add(Double.parseDouble(String.format("%.2f", random.nextDouble()*100000)));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("name", "单体温度最低(℃)");
        jsonObject.put("type", "bar");
        jsonObject.put("stack", "温度");
        jsonObject.put("color", "#FFFFFF");
        jsonObject.put("barMaxWidth", 30);
        list = new ArrayList<>();
        for (int i = 0; i < 5; i ++){
            list.add(Double.parseDouble(String.format("%.2f", random.nextDouble()*100000)));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        jsonObject = new JSONObject();
        jsonObject.put("name", "单体温度极差(℃)");
        jsonObject.put("type", "bar");
        jsonObject.put("stack", "温度");
        jsonObject.put("barMaxWidth", 30);
        list = new ArrayList<>();
        for (int i = 0; i < 5; i ++){
            list.add(Double.parseDouble(String.format("%.2f", random.nextDouble()*100000)));
        }
        jsonObject.put("data", list);
        lines.add(jsonObject);

        return result;
    }

    /**
     * 实时监控 - 项目信息
     * 根据id获取 项目信息 的实例
     * @param id
     * @return
     */
    public JSONObject getProjectDataForBlock(Long id) {
        Random random = new Random();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("address", "上海市浦东新区花木路1111号");    // 地址
        jsonObject.put("contacts", "张经理");   // 联系人
        jsonObject.put("tel", "13100000000");   // 联系电话
        jsonObject.put("system_start_time", new Date());   // 系统上线时间
        jsonObject.put("system_address", "B1 配电间");   // 安装位置
        return jsonObject;
    }

    /**
     * 实时监控 - 系统信息
     * 根据id获取 系统信息 的实例
     * @param id
     * @return
     */
    public JSONObject getSystemDataForBlock(Long id) {
        Random random = new Random();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("could_saving_electricity", String.format("%.2f", random.nextDouble()*100000));    // 可储蓄电量
        jsonObject.put("total_electricity", String.format("%.2f", random.nextDouble()*100000));   // 总容量
        jsonObject.put("grand_total_input_capacity", String.format("%.2f", random.nextDouble()*100000));   // 累计充电量
        jsonObject.put("today_input_capacity", String.format("%.2f", random.nextDouble()*100000));   // 今日充电量
        jsonObject.put("safe_operation_days", String.format("%.2f", random.nextDouble()*100000));   // 安全运行天数
        jsonObject.put("grand_total_output_capacity", String.format("%.2f", random.nextDouble()*100000));   // 累计放电量
        jsonObject.put("today_output_capacity", String.format("%.2f", random.nextDouble()*100000));   // 今日放电量
        jsonObject.put("system_efficiency", String.format("%.2f", random.nextDouble()*100000));   // 系统效率
        jsonObject.put("grand_total_save_electricity_cost", String.format("%.2f", random.nextDouble()*100000));   // 累计节省电费
        jsonObject.put("today_save_electricity_cost", String.format("%.2f", random.nextDouble()*100000));   // 今日节省电费
        return jsonObject;
    }

    /**
     * 根据id刷新 可储蓄电量
     * @param id
     * @return
     */
    public String refreshCouldSavingElectricity(Long id) {
        Random random = new Random();
        return String.format("%.2f", random.nextDouble()*100000);
    }

    /**
     * 根据id刷新 总容量
     * @param id
     * @return
     */
    public String refreshTotalElectricity(Long id) {
        Random random = new Random();
        return String.format("%.2f", random.nextDouble()*100000);
    }



//    ----------------------------------------- 电 池 包 -----------------------------------------
    /**
     * 系统监控 -  电池包级、模组级
     * 获取电池包中电压最高与最低的5个单体
     * @return
     */
    public JSONArray getVoltageData(Long id) {
        JSONArray list = new JSONArray();
        JSONObject jsonObject ;
        for (int i = 0; i < 5; i++){
            jsonObject= new JSONObject();
            jsonObject.put("top_voltage", 5 - i);
            jsonObject.put("top_voltage_name", "单体-高" + i);
            jsonObject.put("bottom_voltage", i);
            jsonObject.put("bottom_voltage_name", "单体-低" + i);
            list.add(jsonObject);
        }
        return list;
    }

    /**
     * 系统监控 -  电池包级、模组级
     * 获取电池包中温度最高与最低的5个单体
     * @return
     */
    public JSONArray getTemperatureData(Long id) {
        JSONArray list = new JSONArray();
        JSONObject jsonObject ;
        for (int i = 0; i < 5; i++){
            jsonObject= new JSONObject();
            jsonObject.put("top_temperature", 5 - i);
            jsonObject.put("top_temperature_name", "单体-高" + i);
            jsonObject.put("bottom_temperature", i);
            jsonObject.put("bottom_temperature_name", "单体-低" + i);
            list.add(jsonObject);
        }
        return list;
    }



}
